﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using XRM.Security.DataAccess;
using XRM.Security.DataAccess.Helpers;
using XRM.Security.WebUI.Helpers;
using XRM.Security.WebUI.Models.SystemUser;
using db = XRM.Security.DataAccess.Models;

namespace XRM.Security.WebUI.Models.UserSkzi
{
    public class UserSkziListModel : BaseViewModel
    {
        public UserSkziListModel()
        {
            SkziList = new List<UserSkziModel>();
        }

        [Display(Name = "Поиск")]
        public string TextFilter { get; set; }
        [Display(Name = "Искать среди удаленных")]
        public bool ShowAllFilter { get; set; }

        public List<UserSkziModel> SkziList { get; set; }
    }

    public class UserSkziModel : BaseViewModel
    {
        public UserSkziModel()
        {
        }

        public UserSkziModel(db.UserSkzi dbEntity)
        {
            Id = dbEntity.UserSkziId;
            UserRegisterId = dbEntity.UserRegisterId;
            SkziKindId = dbEntity.SkziKindId;
            SkziKindName = dbEntity.SkziKind.ShortName;

            PCId = dbEntity.PCId;
            PCSerialNumber = dbEntity.PC.SerialNumber;
                
            CopyNumber = dbEntity.CopyNumber;
            SetupDate = dbEntity.SetupDate;
            SetupSystemUser = new SystemUserModel(dbEntity.SetupSystemUser);
            DeleteDate = dbEntity.DeleteDate;
            DeleteSystemUser = new SystemUserModel(dbEntity.DeleteSystemUser);
            DeleteReason = dbEntity.DeleteReason;
        }

        public void GetSetupUser(db.SystemUser dbEntity)
        {
            SetupSystemUser = new SystemUserModel(dbEntity);
        }

        public void GetDeleteUser(db.SystemUser dbEntity)
        {
            DeleteSystemUser = new SystemUserModel(dbEntity);
        }

        [Required(ErrorMessage = "Поле 'Пользователь' обязательное")]
        public int? UserRegisterId { get; set; }
        public string UserRegisterFullName { get; set; }
        
        public void Init(IDataManager dataManager)
        {
            if ( !UserRegisterId.HasValue )
            {
                PCList = new List<SelectListItem> { SelectedListHelper.EmptyPCItem };
            }
            else
            {
                var user = dataManager.UserRegisterRepository.Get( UserRegisterId );
                UserRegisterFullName = user.FullName();
                PCList = dataManager.UserPCRepository.GetPCByUserId(UserRegisterId.Value).ToSelectedList();
            }
            SkziKindAllList = dataManager.SkziKindRepository.GetAll().Actual().ToSelectedList();
        }

        [Display(Name = "Вид СКЗИ")]
        [Required(ErrorMessage = "Необходимо указать вид СКЗИ")]
        public int? SkziKindId { get; set; }

        [Display(Name = "Серийный номер ПК")]
        [Required(ErrorMessage = "Поле 'Серийный номер ПК' обязательное")]
        public int? PCId { get; set; }

        public string SkziKindName { get; set; }
        public List<SelectListItem> SkziKindAllList { get; set; }
        public string PCSerialNumber { get; set; }
        public List<SelectListItem> PCList { get; set; }

        public DateTime SetupDate { get; set; }
        public SystemUserModel SetupSystemUser { get; set; }
                
        public DateTime? DeleteDate { get; set; }
        public SystemUserModel DeleteSystemUser { get; set; }
                
        [AllowHtml]
        [Display(Name = "Причина удаления")]
        [MaxLength(500, ErrorMessage = "Максимальная длина поля 'Причина удаления' 500 символов")]
        public string DeleteReason { get; set; }

        [AllowHtml]
        [Display(Name = "Номер экземпляра")]
        [Required(ErrorMessage = "Поле 'Номер экземпляра' обязательное")]
        [MaxLength(50, ErrorMessage = "Максимальная длина поля 'Номер экземпляра' 50 символов")]
        public string CopyNumber { get; set; }

        public bool AllowUserChange { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            yield break;
        }
    }
}